﻿using System;
using System.Collections.Generic;
using System.Text;
using BussinessLogicTecnoPez.Tipos_Comunes;
using System.Text.RegularExpressions;
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators;


namespace BussinessLogicTecnoPez.AtencionCliente.Cliente
{
    [Serializable]
    [DBTable("CLIENTES")]
    public class Cliente : EntityBase<Cliente>
    {
        private int idCliente;
        private string razonSocial;
        private string descripcion;
        private TipoDocumento objTipoDocumento;
        private int numeroDocumento;
        private string direccion;
        private string telefono;
        private string correoElectronico;
        private TipoCondicionIVA objTipoCondicionIVA;
        private TipoCliente objTipoCliente;
        private string observaciones;
        private string codigo;

        [FriendlyName("IdCliente",false)]
        [DBField("IDCLIENTE",true,true)]
        public int IdCliente
        {
            get { return idCliente; }
            set { idCliente = value; }
        }

        [NotNullValidator(MessageTemplate = "Código: Debe tener algun valor.")]
        [StringLengthValidator(0, 20, MessageTemplate = "Código: Tamaño máximo es de 20 carateres.")]
        [TecnoPezNoEmptyStringValidator("Código: Debe tener algun valor.")]
        [FriendlyName("Código",true, true, FriendlyName.FilterType.String)]
        [DBField("CODIGO", false, false)]
        public string Codigo
        {
            get { return codigo; }
            set { codigo = value; }
        }

        [NotNullValidator(MessageTemplate = "Razón social: Debe tener algun valor.")]
        [StringLengthValidator(0, 30, MessageTemplate = "Razón social: Tamaño máximo es de 30 carateres.")]
        [TecnoPezNoEmptyStringValidator("Razón social: Debe tener algun valor.")]
        [FriendlyName("Razón Social",true, true, FriendlyName.FilterType.String)]
        [DBField("RAZONSOCIAL",false,false)]
        public string RazonSocial
        {
            get { return razonSocial; }
            set { razonSocial = value; }
        }

        [FriendlyName("Descripción",false)]
        [DBField("DESCRIPCION",false,false)]
        public string Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }

        [NotNullValidator(MessageTemplate = "Tipo Documento: Debe tener algun valor.")]
        [FriendlyName("Tipo Documento",true)]
        [DBField("IDTIPODOCUMENTO",false,false,true,"IDTIPODOCUMENTO")]
        public TipoDocumento TipoDocumento
        {
            get { return objTipoDocumento; }
            set { objTipoDocumento = value; }
        }

        [Int32RangeValidator(0,99999999, MessageTemplate = "Número documento: no posee un formato correcto.")]
        [FriendlyName("Número Documento",true)]
        [DBField("NUMERODOCUMENTO",false,false)]
        public int NumeroDocumento
        {
            get { return numeroDocumento; }
            set { numeroDocumento = value; }
        }

        [FriendlyName("Dirección",false)]
        [DBField("DIRECCION",false,false)]
        public string Direccion
        {
            get { return direccion; }
            set { direccion = value; }
        }

        [FriendlyName("Teléfono",false)]
        [DBField("TELEFONO",false,false)]
        public string Telefono
        {
            get { return telefono; }
            set { telefono = value; }
        }

        [RegexValidator(@"^[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}$", MessageTemplate="Correo electrónico: no posee un formato correcto.")]
        [FriendlyName("Correo electrónico",false)]
        [DBField("CORREOELECTRONICO",false,false)]
        public string CorreoElectronico
        {
            get { return correoElectronico; }
            set 
            {
                if (Regex.IsMatch(value, @"^[\w-\.]{3,}@([\w-]{2,}\.)*([\w-]{2,}\.)[\w-]{2,4}$"))
                    correoElectronico = value;
                else
                    correoElectronico = null;
            }
        }

        [NotNullValidator(MessageTemplate = "Condicion IVA: Debe tener algun valor.")]
        [FriendlyName("Condición IVA",true)]
        [DBField("IDTIPOCONDICIONIVA",false,false,true,"IDTIPOCONDICIONIVA")]
        public TipoCondicionIVA TipoCondicionIVA
        {
            get { return objTipoCondicionIVA; }
            set { objTipoCondicionIVA = value; }
        }

        [NotNullValidator(MessageTemplate = "Tipo Cliente: Debe tener algun valor.")]
        [FriendlyName("Tipo Cliente",false)]
        [DBField("IDTIPOCLIENTE",false,false,true,"IDTIPOCLIENTE")]
        public TipoCliente TipoCliente
        {
            get { return objTipoCliente; }
            set { objTipoCliente = value; }
        }

        [FriendlyName("Observaciones",false)]
        [DBField("OBSERVACIONES",false,false)]
        public string Observaciones
        {
            get { return observaciones; }
            set { observaciones = value; }
        }        

        public override string ToString()
        {
            return this.RazonSocial;
        }

        public int[] obtenerTodosLosPedidos()
        {
            int[] result= new int[0];
            Pedido.Pedido.getManager.AddFilter("Cliente", GenericManager<BussinessLogicTecnoPez.AtencionCliente.Pedido.Pedido>.filterOperator.Equals, IdCliente);
            List<Pedido.Pedido> pedidosDelCliente = Pedido.Pedido.getManager.GetFilter();
            if (pedidosDelCliente.Count > 0)
            {
                result = new int[pedidosDelCliente.Count];
                int i = 0;
                foreach (Pedido.Pedido objPedido in pedidosDelCliente)
                {
                    if (objPedido.TipoEstadoPedido.IdTipoEstadoPedido !=
                        (int)BussinessLogicTecnoPez.Tipos_Comunes.TipoEstadoPedido.TiposEstadosPedidos.Anulado)
                    {
                        result[i] = objPedido.IdPedido;
                        i++;
                    }
                }
            }
            return result;
        }
    }
}
